<main class="main-container ng-scope" ng-view=""><div class="main receptacle post-view ng-scope"><article class="entry ng-scope" ng-controller="EntryCtrl" ui-lightbox=""><header><h1 class="entry-title ng-binding">调皮的location.href</h1><div class="entry-meta"><a target="_blank" class="author name ng-binding">呆子不开口</a> <span class="bull">·</span> <time title="2014/01/23 10:57" ui-time="" datetime="2014/01/23 10:57" class="published ng-binding ng-isolate-scope">2014/01/23 10:57</time></div></header><section class="entry-content ng-binding" ng-bind-html="postContentTrustedHtml"><p></p><h2>0x00 背景</h2><hr><p>随着水瓶月的到来，在祖国繁荣昌盛的今天，web系统的浏览器端也越来越重，很多的功能逻辑都放在了js中，前端的漏洞也越来越多。 我今天就说说location.href跳转的一些问题。</p><p>前端跳转常见的代码形式是:</p><pre><code>#!javascript
location.href = 'http://www.baidu.com';
</code></pre><p>在前端js中有可能是这样:</p><pre><code>#!javascript
var hash = location.hash;
if(hash)
{
var url = hash.substring(1);
location.href = url;
}
</code></pre><h2>0x01 常见的跳转漏洞</h2><hr><p>什么是跳转漏洞？突破了系统预期的跳转，就是跳转漏洞。大多数系统的预期是跳转到当前域url的http访问。</p><p>以上面的代码为例，hash值为攻击者可控，常见的漏洞形式可以为：</p><pre><code>http://yigezangpao.com/test.html#http://jiajiba.taobao.com
</code></pre><p>这个地址会利用信任关系跳转到钓鱼网站</p><pre><code>http://yigezangpao.com/test.html#javascript:alert(document.cookie)
</code></pre><p>这个会跳转到浏览器端的javascript协议而执行js，成了一个反射的xss，而且浏览器端的xssfilter对它无效</p><h2>0x02 跳转漏洞的危害</h2><hr><p>可能的危害场景如下：</p><p>受害用户被骗点击进入了钓鱼站，可导致家破人亡妻离子散被网友拉黑……</p><p>在一些sns网站中，点击第三方网站时，可能会有安全提示，恶意网址则可利用信任域的身份，绕过了检查。</p><p>很多app带有二维码扫描功能，对本域或白名单域会不做提示，直接跳转访问。</p><p>当你扫描一个二维码的时候，你可能已经点击了一个恶意或含有某种攻击代码的网页javascript为协议的反射型xss。</p><p>一般的社区发表链接时，不会自动识别浏览器的伪协议，不会形成可点击的链接，但是利用跳转漏洞，则可以欺骗目标用户打开某个浏览器伪协议……</p><h2>0x03 目前的防护的一些问题</h2><hr><p>我见到的常见的有防护有：</p><pre><code>给变量前加"/"或者只有"/"开头的才跳转
替换变量中的":"
替换"http://"
匹配域名白名单
……
</code></pre><p>这几类或多或少有些问题，如下：</p><p>对于在变量前加/的，或者/开头才跳转的，他们预期的是控制在本域下。但当</p><pre><code>#!javascript
location.href = "//diaoyuwangzhan.com"
</code></pre><p>时，浏览器会把后面的识别成一个标准的url来跳转，而不是一个绝对路径。</p><p>对于允许第三方跳转的，匹配域名白名单的，一定要写好正则的逻辑严格匹配url的标准格式，否则可能会被</p><pre><code>http://yigezangpao.com.jiajiba.taobao.com
http:<a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="220d0d5b4b454758434c4552434d0c414d4f62484b43484b40430c56434d40434d0c414d4f">[email&#160;protected]</a>
http://jiajiba.taobao.com/yigezangpao.com
</code></pre><p>等绕过</p><p>对于替换”:“的防护：</p><p>twitter曾经犯过这样的错，twitter的程序员是这样改的：</p><pre><code>#!javascript
var c = location.href.split("#!")[1];     if (c) {     window.location = c.replace(":", "");     } else {     return true;     }
</code></pre><p>结果又被如下链接干：</p><pre><code>http://twitter.com/#!javascript::alert(document.domain); 
</code></pre><p>比第一次多了个：</p><p>因为replace()函数的第一个参数，按照规范中的方式，是要用正则写的。如果第一个参数是一个字符串，javascript默认只会替换掉他找到的第一个字符</p><h2>0x04 比杨幂还神奇</h2><hr><p>对于上面的替换":"的方案，如果完全替换，是不是就没有问题了呢？</p><p>如果你曾觉得你的女友不可理喻，那么当我告诉你有一个东西的不可理喻程度已经达到你女友的50%时，你一定会惊呼，”天呐，竟然还有这么变态的东西！！！“ 不错，你猜的非常对，这个不可理喻的东西就是ie浏览器</p><p>如前文的例子，如果对方已经完全替换":"，你试试在ie中访问如下链接</p><pre><code>http://yigezangpao.com/test.html#javascript&amp;#x3A;alert(1)
</code></pre><p>也就是</p><pre><code>#!javascript
location.href = "javascript&amp;#x3A;alert(1)"
</code></pre><p>你会惊奇的发现弹了，<code>'&amp;#x3A;'是':'</code>的html编码，至于为什么会这样我不知道，我的是ie11，其他版本没测</p><h2>0x05 解决方案</h2><hr><p>对于不允许跳转到第三方的，可以使用location.pathname来跳转，用这个跳转绝对靠谱。</p><p>有句成语”path就不是共产党员“就是修饰这个属性的，既然不是共产党员，说明path是靠谱的。</p><p>对于允许跳转到第三方的，做好白名单的检查规则。</p><p></p></section></article><div class="entry-controls clearfix"><div style="float:left;color:#9d9e9f;font-size:15px"><span>&copy;乌云知识库版权所有 未经许可 禁止转载</span></div></div><div id="donate" style="padding:10px;border-top:1px solid #d9d9d9;text-align:center"><span>碎银子打赏，作者好攒钱娶媳妇：</span><br><br><img src="http://static.wooyun.org/wooyun/upload/donate/20141107151016b856da2806bef8211173771f9366c5a3.png" style="width:200px;height:200px"></div><div class="yarpp-related"><h3>为您推荐了适合您的技术文章:</h3><ol id="recommandsystem"><li><a href="http://drops.wooyun.org/papers/894" rel="bookmark" id="re1">XSS挑战第一期Writeup</a></li><li><a href="http://drops.wooyun.org/papers/104" rel="bookmark" id="re2">Clickjacking简单介绍</a></li><li><a href="http://drops.wooyun.org/papers/917" rel="bookmark" id="re3">用SVG来找点乐子</a></li><li><a href="http://drops.wooyun.org/papers/938" rel="bookmark" id="re4">XSS挑战第二期 Writeup</a></li></ol></div><div id="comments" class="comment-list clearfix"><div id="comment-list"><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">1937nick</span> <span class="reply-time">2015-04-24 14:54:06</span></div><p></p><p>&lt;img src=&quot;&amp;#106&amp;#97&amp;#118&amp;#97&amp;#115&amp;#99&amp;#114&amp;#105&amp;#112&amp;#116&amp;#58&amp;#97&amp;#108&amp;#101&amp;#114&amp;#116&amp;#40&amp;#39&amp;#88&amp;#83&amp;#83&amp;#39&amp;#41&amp;#59&quot;&gt;</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">小贱人</span> <span class="reply-time">2014-11-18 17:07:43</span></div><p></p><p>两点该学习<br>1 replace只过滤掉第一个<br>2 ie下实体字符可以替代冒号</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">D＆G</span> <span class="reply-time">2014-01-25 18:59:18</span></div><p></p><p>path不是共产党员。。</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">呆子不开口</span> <span class="reply-time">2014-01-25 18:59:04</span></div><p></p><p>chrome就没这么做，ie这么干，开发者肯定大多不会知道这个背景，所以才有了绕过的可能</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">phith0n</span> <span class="reply-time">2014-01-25 12:52:21</span></div><p></p><p>在javascript中应该会先把html实体转换成原字符，再执行<br>location.href = "javascript&#x3A;alert(1)"就先被转换成<br>location.href = "javascript:alert(1)"</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">剑无名</span> <span class="reply-time">2014-01-25 10:44:02</span></div><p></p><p>比杨幂还神奇</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">luwikes</span> <span class="reply-time">2014-01-24 10:36:44</span></div><p></p><p>path不是共产党员。。</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">clzzy</span> <span class="reply-time">2014-01-23 16:37:43</span></div><p></p><p>回家吃饭</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">沙豆</span> <span class="reply-time">2014-01-23 14:48:55</span></div><p></p><p>好，写完投到乌云读书频道</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">呆子不开口</span> <span class="reply-time">2014-01-23 13:28:29</span></div><p></p><p>写个德州攻略吧</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">p.z</span> <span class="reply-time">2014-01-23 11:56:06</span></div><p></p><p>path就不是共产党员</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">Chu</span> <span class="reply-time">2014-01-23 11:55:09</span></div><p></p><p>发现你了，投个文章过来吧，否则你懂得 :)</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">沙豆</span> <span class="reply-time">2014-01-23 11:53:33</span></div><p></p><p>人艰不拆啊</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">瞌睡龙</span> <span class="reply-time">2014-01-23 11:46:20</span></div><p></p><p>发现你了，投个文章过来吧，否则你懂得 :)</p><p></p></div></div><div class="note-comment"><img class="avatar" alt="30" src="http://wooyun.b0.upaiyun.com/wooyun_job/avatar/default.png"><div class="content"><div class="comment-header"><span class="author-link">沙豆</span> <span class="reply-time">2014-01-23 11:24:48</span></div><p></p><p>楼主果然是个诗人</p><p></p></div></div></div></div></div></main>